home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / NRDUMP.C < prev    next >
C/C++ Source or Header  |  1996-08-29  |  4KB  |  123 lines

  1. /* NET/ROM header tracing routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "netrom.h"
  7. #include "trace.h"
  8.  
  9. #if !defined(_lint)
  10. static char rcsid[] OPTIONAL = "$Id: nrdump.c,v 1.8 1996/08/29 12:11:16 root Exp root $";
  11. #endif
  12.  
  13.  
  14. /* Display NET/ROM network and transport headers */
  15. void
  16. netrom_dump (FILE *fp, struct mbuf **bpp, int check)
  17. {
  18. char src[AXALEN], dest[AXALEN];
  19. char tmp[AXBUF];
  20. char thdr[NR4MINHDR];
  21. register i;
  22.  
  23.     if (bpp == NULLBUFP || *bpp == NULLBUF)
  24.         return;
  25.     /* See if it is a routing broadcast */
  26.     if (uchar (*(*bpp)->data) == NR3NODESIG) {
  27.         (void) PULLCHAR (bpp);    /* Signature */
  28.         (void) pullup (bpp, (unsigned char *) tmp, ALEN);
  29.         tmp[ALEN] = '\0';
  30.         traceprintf (fp, "NET/ROM Routing: %s\n", tmp);
  31.         for (i = 0; i < NRDESTPERPACK; i++) {
  32.             if (pullup (bpp, (unsigned char *) src, AXALEN) < AXALEN)
  33.                 break;
  34.             traceprintf (fp, "        %12s", pax25 (tmp, src));
  35.             (void) pullup (bpp, (unsigned char *) tmp, ALEN);
  36.             tmp[ALEN] = '\0';
  37.             traceprintf (fp, "%8s", tmp);
  38.             (void) pullup (bpp, (unsigned char *) src, AXALEN);
  39.             traceprintf (fp, "    %12s", pax25 (tmp, src));
  40.             tmp[0] = (char) PULLCHAR (bpp);
  41.             traceprintf (fp, "    %3u\n", uchar (tmp[0]));
  42.         }
  43.         return;
  44.     }
  45.     /* See if it is a routing poll - WG7J */
  46.     if (uchar (*(*bpp)->data) == NR3POLLSIG) {
  47.         (void) PULLCHAR (bpp);    /* Signature */
  48.         (void) pullup (bpp, (unsigned char *) tmp, ALEN);
  49.         tmp[ALEN] = '\0';
  50.         traceprintf (fp, "NET/ROM Poll: %s\n", tmp);
  51.         return;
  52.     }
  53.     /* Decode network layer */
  54.     (void) pullup (bpp, (unsigned char *) src, AXALEN);
  55.     traceprintf (fp, "NET/ROM: %s", pax25 (tmp, src));
  56.  
  57.     (void) pullup (bpp, (unsigned char *) dest, AXALEN);
  58.     traceprintf (fp, "->%s", pax25 (tmp, dest));
  59.  
  60.     i = PULLCHAR (bpp);
  61.     traceprintf (fp, " ttl %d\n", i);
  62.  
  63.     /* Read first five bytes of "transport" header */
  64.     (void) pullup (bpp, (unsigned char *) thdr, NR4MINHDR);
  65.     switch (thdr[4] & NR4OPCODE) {
  66.         case NR4OPPID:    /* network PID extension */
  67.             if (thdr[0] == NRPROTO_IP && thdr[1] == NRPROTO_IP) {
  68.                 ip_dump (fp, bpp, check);
  69.                 return;
  70.             } else
  71.                 traceprintf (fp, "         protocol family %x, proto %x",
  72.                       uchar (thdr[0]), uchar (thdr[1]));
  73.             break;
  74.         case NR4OPCONRQ:    /* Connect request */
  75.             traceprintf (fp, "         conn rqst: ckt %d/%d", uchar (thdr[0]), uchar (thdr[1]));
  76.             i = PULLCHAR (bpp);
  77.             traceprintf (fp, " wnd %d", i);
  78.             (void) pullup (bpp, (unsigned char *) src, AXALEN);
  79.             traceprintf (fp, " %s", pax25 (tmp, src));
  80.             (void) pullup (bpp, (unsigned char *) dest, AXALEN);
  81.             traceprintf (fp, "@%s", pax25 (tmp, dest));
  82.             break;
  83.         case NR4OPCONAK:    /* Connect acknowledgement */
  84.             traceprintf (fp, "         conn ack: ur ckt %d/%d my ckt %d/%d",
  85.               uchar (thdr[0]), uchar (thdr[1]), uchar (thdr[2]),
  86.                      uchar (thdr[3]));
  87.             i = PULLCHAR (bpp);
  88.             traceprintf (fp, " wnd %d", i);
  89.             break;
  90.         case NR4OPDISRQ:    /* Disconnect request */
  91.             traceprintf (fp, "         disc: ckt %d/%d",
  92.                      uchar (thdr[0]), uchar (thdr[1]));
  93.             break;
  94.         case NR4OPDISAK:    /* Disconnect acknowledgement */
  95.             traceprintf (fp, "         disc ack: ckt %d/%d",
  96.                      uchar (thdr[0]), uchar (thdr[1]));
  97.             break;
  98.         case NR4OPINFO:/* Information (data) */
  99.             traceprintf (fp, "         info: ckt %d/%d",
  100.                      uchar (thdr[0]), uchar (thdr[1]));
  101.             traceprintf (fp, " txseq %d rxseq %d",
  102.                      uchar (thdr[2]), uchar (thdr[3]));
  103.             break;
  104.         case NR4OPACK:    /* Information acknowledgement */
  105.             traceprintf (fp, "         info ack: ckt %d/%d",
  106.                      uchar (thdr[0]), uchar (thdr[1]));
  107.             traceprintf (fp, " txseq %d rxseq %d",
  108.                      uchar (thdr[2]), uchar (thdr[3]));
  109.             break;
  110.         default:
  111.             traceprintf (fp, "         unknown transport type %d",
  112.                      thdr[4] & 0x0f);
  113.             break;
  114.     }
  115.     if (thdr[4] & NR4CHOKE)
  116.         traceprintf (fp, " CHOKE");
  117.     if (thdr[4] & NR4NAK)
  118.         traceprintf (fp, " NAK");
  119.     if (thdr[4] & NR4MORE)
  120.         traceprintf (fp, " MORE");
  121.     traceprintf (fp, "\n");
  122. }
  123.